#pragma once

#include <functional>
#include "base/Timer.h"
#include "base/MessageLoop.h"
 
#include "network/model/ClientNode.h"
#include "broker/BrokerConfig.h"
#include "network/protocol/transport.pb.h"

namespace zeroplus::mq
{
    //  生产者、消费者向broker发送心跳，broker向nameserver发送心跳，不需要响应
    //  生产者、消费者从nameserver拉取路由信息，需要响应
    //  broker接收到消息需要回一个ack给生产者，消费者消费完消息需要回一个ack给broker，不需要响应
    //  Broker注册、更新路由信息到nameserver，需要响应
    //  nameserver扫描broker的存活状态不是走网络通信，而是遍历其管理的存活列表brokerLiveTable，这个table记录着上一次broker发送心跳的时间
    class RouteInfoUploader
    {
    private:
        std::shared_ptr<ClientNode> client_; // 向namesrv发送心跳、路由注册、路由注销、路由查询
        MessageLoop messageLoop_;
        std::vector<std::shared_ptr<Timer>> timerList_;
        std::shared_ptr<RedisStore> redisStore_;

    public:
        RouteInfoUploader();
        ~RouteInfoUploader();
        bool Start();
        bool Stop();
        transport::RegisterRouteInfoResponse SendRegisterRouteInfoRequest();
        transport::UnRegisterRouteInfoResponse SendUnRegisterRouteInfoRequest();
    };
}
